package com.twod.feralvillage;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;

public class ExtrasMenuActivity extends Activity {
        private View mLinearModeButton;
        private View mLevelSelectButton;
    private View mControlsButton;
    private View mBackground;
    private View mLevelSelectLocked;
    private Animation mButtonFlickerAnimation;
    private Animation mFadeOutAnimation;
    private Animation mAlternateFadeOutAnimation;
    private Animation mLockedAnimation;
   
    private int mPendingGameStart;
   
   
    public static final int NEW_GAME_DIALOG = 0;
    public static final int EXTRAS_LOCKED_DIALOG = 1;

    private static final int START_LEVEL_SELECT = 1;

   
   
    private View.OnClickListener sLevelSelectButtonListener = new View.OnClickListener() {
        public void onClick(View v) {
                SharedPreferences prefs = getSharedPreferences(PreferenceConstants.PREFERENCE_NAME, MODE_PRIVATE);
            final int row = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_ROW, 0);
            final int index = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_INDEX, 0);
            if (row != 0 || index != 0) {
                mPendingGameStart = START_LEVEL_SELECT;
                showDialog(NEW_GAME_DIALOG);
            } else {
                startGame(START_LEVEL_SELECT);
            }
        }
    };
   
    private View.OnClickListener sLockedSelectButtonListener = new View.OnClickListener() {
        public void onClick(View v) {
                showDialog(EXTRAS_LOCKED_DIALOG);  
        }
    };
   
    private View.OnClickListener sControlsButtonListener = new View.OnClickListener() {
        public void onClick(View v) {
       
            Intent i = new Intent(getBaseContext(), SetPreferencesActivity.class);
            i.putExtra("controlConfig", true);
           
            v.startAnimation(mButtonFlickerAnimation);
            mFadeOutAnimation.setAnimationListener(new StartActivityAfterAnimation(i));
            mBackground.startAnimation(mFadeOutAnimation);
            mLevelSelectButton.startAnimation(mAlternateFadeOutAnimation);
        }
    };
   
         @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.extras_menu);
       
        SharedPreferences prefs = getSharedPreferences(PreferenceConstants.PREFERENCE_NAME, MODE_PRIVATE);
        final boolean extrasUnlocked = prefs.getBoolean(PreferenceConstants.PREFERENCE_EXTRAS_UNLOCKED, false);
       
        mLevelSelectButton = findViewById(R.id.levelSelectButton);
        mControlsButton = findViewById(R.id.controlsButton);
        mLevelSelectLocked = findViewById(R.id.levelSelectLocked);
       
        mBackground = findViewById(R.id.mainMenuBackground);
       
        mButtonFlickerAnimation = AnimationUtils.loadAnimation(this, R.anim.button_flicker);
        mFadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);
        mAlternateFadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);  

       
        if (extrasUnlocked) {
                mLevelSelectButton.setOnClickListener(sLevelSelectButtonListener);
                mLevelSelectLocked.setVisibility(View.GONE);
        } else {
            mLockedAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in_out);

                mLevelSelectButton.setOnClickListener(sLockedSelectButtonListener);
                mLevelSelectLocked.startAnimation(mLockedAnimation);
        }
        mControlsButton.setOnClickListener(sControlsButtonListener);
       
       
             
        // Keep the volume control type consistent across all activities.
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
    }
       
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
                boolean result = true;
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                        finish();
                       
                        if (UIConstants.mOverridePendingTransition != null) {
                       try {
                          UIConstants.mOverridePendingTransition.invoke(ExtrasMenuActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
                       } catch (InvocationTargetException ite) {
                           DebugLog.d("Activity Transition", "Invocation Target Exception");
                       } catch (IllegalAccessException ie) {
                           DebugLog.d("Activity Transition", "Illegal Access Exception");
                       }
             }
                } else {
                        result = super.onKeyDown(keyCode, event);
                }
                return result;
        }

        @Override
    protected Dialog onCreateDialog(int id) {
        Dialog dialog = null;
        if (id == NEW_GAME_DIALOG) {
               
            dialog = new AlertDialog.Builder(this)
                .setTitle(R.string.new_game_dialog_title)
                .setPositiveButton(R.string.new_game_dialog_ok, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        startGame(mPendingGameStart);
                    }
                })
                .setNegativeButton(R.string.new_game_dialog_cancel, null)
                .setMessage(R.string.new_game_dialog_message)
                .create();
        } else if (id == EXTRAS_LOCKED_DIALOG) {
            dialog = new AlertDialog.Builder(this)
                .setTitle(R.string.extras_locked_dialog_title)
                .setPositiveButton(R.string.extras_locked_dialog_ok, null)
                .setMessage(R.string.extras_locked_dialog_message)
                .create();
        }
        return dialog;
    }

        protected void startGame(int type) {
                 if (type == START_LEVEL_SELECT) {
            Intent i = new Intent(getBaseContext(), DifficultyMenuActivity.class);
            i.putExtra("startAtLevelSelect", true);
            i.putExtra("newGame", true);
            mLevelSelectButton.startAnimation(mButtonFlickerAnimation);
            mButtonFlickerAnimation.setAnimationListener(new StartActivityAfterAnimation(i));
           
        } 
        }

        protected class StartActivityAfterAnimation implements Animation.AnimationListener {
                private Intent mIntent;
               
                StartActivityAfterAnimation(Intent intent) {
                    mIntent = intent;
                }
                   

                public void onAnimationEnd(Animation animation) {
                        mLevelSelectButton.setVisibility(View.INVISIBLE);
                        mLevelSelectButton.clearAnimation();
                        mControlsButton.setVisibility(View.INVISIBLE);
                        mControlsButton.clearAnimation();
                    startActivity(mIntent);  
                    finish();
                    if (UIConstants.mOverridePendingTransition != null) {
                               try {
                                  UIConstants.mOverridePendingTransition.invoke(ExtrasMenuActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
                               } catch (InvocationTargetException ite) {
                                   DebugLog.d("Activity Transition", "Invocation Target Exception");
                               } catch (IllegalAccessException ie) {
                                   DebugLog.d("Activity Transition", "Illegal Access Exception");
                               }
                     }
                }

                public void onAnimationRepeat(Animation animation) {
                    // TODO Auto-generated method stub
                   
                }

                public void onAnimationStart(Animation animation) {
                    // TODO Auto-generated method stub
                   
                }
               
            }
       
}

